/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef ACOLITOPERSONAS_H
#define ACOLITOPERSONAS_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QDataWidgetMapper>
#include <QSortFilterProxyModel>
#include <QModelIndex>

#include <nuevoasistentedialog.h>
#include <modeloasistente.h>
#include <cambiohabitaciondialog.h>

namespace Ui {
    class AcolitoPersonas;
}

class AcolitoPersonas : public QWidget {
    Q_OBJECT

    Q_PROPERTY(bool conectado READ isConectado WRITE setConectado)
    Q_PROPERTY(int grupo READ grupoActual WRITE setGrupoActual)

public:
    AcolitoPersonas(QWidget *parent = 0);
    ~AcolitoPersonas();

    bool isConectado() const
    { return flagConectado; }

    int grupoActual() const
    {
        return grupoAsistente;
    }

signals:

    /*!
      Se ha producido un cambio de habitacion
      */

    void cambioHabitacion();

public slots:

    /*!
      Conecta el acolito a la base de datos
      */

    void setConectado(bool estado);

    /*!
      Dialogo de asistentes
      */

    void addAsistentesDialog();

    /*!
      Nueva lista de asistentes
      */

    void nuevosAsistentes(QStandardItemModel *grupoAsistentes);

    /*!
      Eliminar asistentes
      */

    void eliminarAsistentes();

    /*!
      Eliminar del grupo
      */

    void transferirANuevoGrupo();

    /*!
      Recarga los modelos
      */

    void reloadModelos();

    /*!
      Presenta el dialogo para cambiar el grupo de habitacion
      */

    void dialogoCambiaHabitacion();

protected:

    void changeEvent(QEvent *e);

private:
    bool flagConectado; ///< bandera de conexion
    int grupoAsistente; ///< Grupo del asistente seleccionado
    Ui::AcolitoPersonas *ui;

    ModeloAsistente *modeloPersonas;         ///< Modelo de personas
    QDataWidgetMapper *mapper;              ///< Mappeador de datos para el widget
    QSortFilterProxyModel *filtroGrupo;     ///< Filtro del grupo
    QSqlTableModel *modeloHabitacion;       ///< Modelo de habitaciones
    QDataWidgetMapper *mapperHabitacion;    ///< Mapeador de datos para el modelo de habitaciones

    /*!
      Prepara el Acolito
      */

    void setup();

private slots:

    void setGrupoActual(int g);

    /*!
      Filtra la habitación correspondiente al grupo
      @param actual Nuevo valor de QModelIndex
      @param anterior   Valor anterior de QModelIndex
      */

    void filtraHabitacion(const QModelIndex &actual,const QModelIndex &anterior);

    /*!
      Cambia el grupo de habitacion
      */

    void trasladaGrupo();

};

#endif // ACOLITOPERSONAS_H
